Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new charger template: TeslaLogger #13062

Closed
wants to merge 6 commits into from

Conversation

Adminius
Copy link
Contributor

@Adminius Adminius commented Mar 20, 2024

Refs #13046, depends on #13056

@andig andig added the enhancement New feature or request label Mar 20, 2024
@andig andig self-assigned this Mar 20, 2024
Co-authored-by: andig <cpuidle@gmx.de>
@andig andig added the devices Specific device support label Mar 20, 2024
@andig
Copy link
Member

andig commented Mar 24, 2024

@Adminius sollte alles bereit sein? Du kannst jetzt auch GetMaxCurrent hinzu fügen.

enabled:
source: http
uri: {{ .url }}:{{ .port }}/currentjson/{{ .id }}
jq: .charging
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das passt nicht: hier gehts drum, ob Ladefreigabe erteilt ist, also charge_amps > 0?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was genau macht enabled?
Mit der aktuellen Lösung meckert EVCC ab und zu "out of sync"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gibt an ob Laden freigegeben ist. Das Gegenstück zu enable.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, da könnte man eine Kombinaion nehmen: Ziel SoC unter Aktuellem SoC. Plugged-in wird eh schon ausgewertet.
Was besseres fällt mir nicht ein

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Darum gehts nicht. Es geht nur darum ob evcc die Ladung freigegeben hat. Im Zweifel Freigabestrom > 0A?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wie würde die Lösung aussehen wenn ich es in TeslaLogger einbauen würde.

Das wäre wohl eine Option...

Evtl. habe ich die Logik immer noch nicht verstanden 🤔

Stell Dir das als schaltbare Steckdose vor. Die ist an oder aus, unabhängig davon ob ein Stecker steckt oder das Gerät lädt. evcc würde die Dose zwar nicht einschalten wenn kein Auto dran hängt, solang eins dran ist allerdings schon (soc mag gefallen sein, Klimaanlage lief etc).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kein Auto daran ist ja Status A
Auto dran, nicht laden ist Status B
Auto dran, laden Status C

Wenn SoC gefallen ist, wird das Auto nachladen, StatusC, egal was EVCC denkt/macht

Nun, beim Status A und B erwarte ich, dass die Dose aus ist, beim C aber an.
Hier also enabled=false bei charging=false
Enabled=true bei charging=true

Oder ist die an beim B+C?
Hier ist es also bei enabled=false: plugged_in=false
Beim True: plugged_in=true

Ich sehe z.B. keine Sinn warum bei Status A eine Dose an sein sollte.
Da wäre enabled=true einfach immer.

War es nicht gleiches Problem bei OpenWB?

Copy link
Member

@andig andig Mar 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Egal was Du intuitiv erwartest- denk an die Schaltsteckdose. Die schaltet sich auch nicht aus nur weil Du das Ladegerät abziehst...

Nun, beim Status A und B erwarte ich, dass die Dose aus ist, beim C aber an.

Dann erklär mir mal bitte, wie Du in Status C kommen willst wenn die Steckdose ausgeschaltet ist???

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dann erklär mir mal bitte, wie Du in Status C kommen willst wenn die Steckdose ausgeschaltet ist???
Status B: enable = false, Steckodse ist aus (Schütze in der Wallbox)
Status C: enable = true, denn zum Laden muss man die Steckdose einschalten (Schütze in der Wallbox)
Bei der Steckdose wissen wir auch nicht, dass etwas angeschlossen ist, bei der Wallbox/ dem TeslaLogger schon ;)

So oder so: ich kommen zu meiner Frage zurück: was muss ich in TeslaLogger programmieren, damit EVCC zufrieden ist? Einfach EVCCs enable "merken" und als "enabled" zurückgeben ist wohl nicht der Sinn der Sache, oder? Das könnte man bestimmt direkt in EVCC mit Script und Variablen lösen, oder?

Ich lade an einem mobilen Charger, ohne jegliche Schnittstelle, so ist die Idee auch entstanden über das Tesla zu regeln.
Nun, wenn ich Kabel anstecke und Tesla keinen Timer hat und SoC und Ziel SoC liegt startet der Ladevorgang sofort. Auch wenn EVCC jetzt enabled=false erwarten würde (z.B. zu wenig Überschuss), läuft der Ladevorgang schon, EVCC ist beleidigt, "disabled, but charging" (oder so ähnlich).

D.h. eigentlich müsste man komplette Wallbox Logik nachbauen: merken was die "externen" wollen: enable=false und sobald man Kabel einsteckt Ladevorgang sofort beenden und warten bis enable=true kommt. Dann würde auch enabled von false auf true erst dann wechseln wenn EVCC Ladevorgang erlaubt.

Nun, im Auto/in der TeslaApp kann ich den Ladevorgang aber trotzdem starten -> enable steht immer noch auf false. Also wird der wieder beendet. Ich will aber laden, jetzt. D.h. da müsste ich zuerst EVCC aufrufen um Ladevorgang zu starten. Ist das auch bei den "richtigen" Wallboxen so?

Aber auch hier, kann zu "out of sync" kommen, wenn das Timing nicht passt und EVCC die Daten in der "falschen" Sekunde abruft. Also eigentlich müsste man auch "gefilterten" isCharing Status vorgaukeln, d.h. isCharing = false, obwohl der Ladevorgang beginnt und TeslaLogger ihn aber gleich beenden wird.

So eine Programmierung wird aber wohl länger dauern... Wir wollt ihr das in der Tesla Integration lösen? Oder (noch) gar nicht?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So oder so: ich kommen zu meiner Frage zurück: was muss ich in TeslaLogger programmieren, damit EVCC zufrieden ist? Einfach EVCCs enable "merken" und als "enabled" zurückgeben ist wohl nicht der Sinn der Sache, oder? Das könnte man bestimmt direkt in EVCC mit Script und Variablen lösen, oder?

Aktuell gibts das nicht weil evcc davon ausgeht, dass sich eine WB ein- und ausschalten lässt. evcc stört sich dran wenn es a) nicht den erwarteten Wert bekommen (Wallbox neu gebootet?) oder b) der Wert nicht zu den anderen passt, z.B. disabled but charging.

Wir wollt ihr das in der Tesla Integration lösen? Oder (noch) gar nicht?

Was meinst Du? Beim TWC machen wir das so:

// Enable implements the api.Charger interface
func (c *Twc3) Enable(enable bool) error {
	// ignore disabling when vehicle is already disconnected
	// https://github.com/evcc-io/evcc/issues/10213
	status, err := c.Status()
	if err != nil {
		return err
	}
	if status == api.StatusA && !enable {
		c.enabled = false
		return nil
	}

	v, ok := c.lp.GetVehicle().(api.ChargeController)
	if !ok {
		return errors.New("vehicle not capable of start/stop")
	}

	err = v.ChargeEnable(enable)
	if err == nil {
		c.enabled = enable
	}

	return err
}

und Enabled() macht einen Workaround:

// Enabled implements the api.Charger interface
func (c *Twc3) Enabled() (bool, error) {
	return verifyEnabled(c, c.enabled)
}

// verifyEnabled validates the enabled state against the charger status
func verifyEnabled(c api.Charger, enabled bool) (bool, error) {
	if enabled {
		return true, nil
	}

	status, err := c.Status()

	// always treat charging as enabled
	return status == api.StatusC, err
}

Mit anderen Worten: in diesem Fall speichern wir einfach den vorgegebenen Wert und geben ihn gleichzeitig an das Fahrzeug weiter (ein/aus). Für die Abfrage geben wir ihn zurück und validieren ihn nochmal gegen den Status der Wallbox.

@andig
Copy link
Member

andig commented Mar 24, 2024

Once this is merged it would be great to post in TFF that this provides TESLA-only charging support in evcc ;)

@bill340

This comment was marked as off-topic.

@Adminius
Copy link
Contributor Author

test it out?

you can use it without merging:

Put the right TeslaLogger IP-address and Port and carID (in my example is 3)

chargers:
  - name: TeslaLoggerWallBox
    type: custom
    status:
      source: combined
      charging:
        source: http
        uri: http://192.168.x.x:5000/currentjson/3
        jq: .charging
      plugged:
        source: http
        uri: http://192.168.x.x:5000/currentjson/3
        jq: if .plugged_in and .TLGeofenceIsHome then true else false end
    enabled:
      source: http
      uri: http://192.168.x.x:5000/currentjson/3
      jq: .charging
    enable:
      source: http
      uri: http://192.168.x.x:5000/command/3/charge_start_stop?${enable}
    maxcurrent:
      source: http
      uri: http://192.168.x.x:5000/command/3/set_charging_amps?${maxcurrent}
    wakeup:
      source: http
      uri: http://192.168.x.x:5000/command/3/wake_up

@bill340
Copy link

bill340 commented Mar 30, 2024

I tried, but get this error:
charger status: Get "http://192.168.2.114:5000/currentjson/3": dial tcp 192.168.2.114:5000: connect: connection refused

@Adminius
Copy link
Contributor Author

I tried, but get this error: charger status: Get "http://192.168.2.114:5000/currentjson/3": dial tcp 192.168.2.114:5000: connect: connection refused

Is "3" at the end the right CarID in your case?

@bill340
Copy link

bill340 commented Mar 30, 2024

Ohh no. It is 1. I changed it, but same error...

And just to confirm, for "vehicle" I added one vehicle with teslalogger template (id:1)

@bill340

This comment was marked as off-topic.

@github-actions github-actions bot added the stale Outdated and ready to close label May 8, 2024
@github-actions github-actions bot closed this May 13, 2024
@andig
Copy link
Member

andig commented May 15, 2024

@Adminius sollen wir hier nochmal einen Anlauf machen? Das Enable/Enabled ist ja nur insofern unschön, als dass es zu Unmengen von Fehlermeldungen führt und im Zweifel zuviele Requests macht. Evtl.- ich hab das allerdings nicht ausprobiert- könnte man statt http auch das go Plugin für eine interne Statusvariable nutzen. Also bei enable den Status jedesmal speichern (...und das Fahrzeug steuern) und bei enabled einfach genau diesen wieder zurück geben. Vielleicht hast Du ja Lust, das nochmal auszuprobieren.

@Adminius
Copy link
Contributor Author

Adminius commented May 16, 2024

Hey @andig ja, das könnte man noch probieren.
Ich habe aber leider noch ein anderes Problem festgestellt, das damit nicht gelöst wird:
Ich habe an einem DC Charger geladen, weit weg von Zuhause und wollte checken ob EVCC er richtig erkennt: ja, er hat als nicht angesteckt erkannt, aber in dem Moment wo ich EVCC UI aufgerufen habe einen Stop-Befehl geschickt und schon ist DC-Ladevorgang abgebrochen :/
Ich habe mir dabei nichts gedacht, da ich schon bei 80% war und dachte es liegt daran.
Am nächsten Tag ist aber das gleiche passiert, wieder in dem Moment wo ich EVCC UI aufgerufen habe obwohl EVCC korrekt als nicht angesteckt angezeigt hat...
Da musste ich EVCC komplett killen (Docker unter Home Assistant)

Deswegen fokussiere ich mich doch auf die TeslaLogger-WallBox API, damit ich solche Befehle gar nicht erst ans Auto weiterleite.
Das dauert aber jetzt länger (Sommer, Garten... andre Prios)

EDIT: und noch etwas: ich kann nicht öfter als 45 Sek Aktualisierung einstellen, weil Tesla nicht schneller reagiert.
Evtl. habe ich es nicht gefunden, cool wäre wenn man Datenabfrage (z.B. 10 Sek) und Steuerintervalle (45 Sek) getrennt einstellen könnten. Dann würde man nicht solange warten bis man neue Werte sieht, manchmal ist es echt verwirrend (z.B. HA zeigt schon, dass Auto mit vollen 16A lädt), EVCC ist aber noch bei 10A, weil di e 45 sek noch nicht durch sind. Dann kommt die Wolke, PV ist nicht mehr bei 12kW sondern bei 6kW, EVCC zeigt immer noch 12, Auto 11. Realität ist aber 6 PV, 6 Akku und 11 Auto.

@andig
Copy link
Member

andig commented May 16, 2024

Ich habe an einem DC Charger geladen, weit weg von Zuhause und wollte checken ob EVCC er richtig erkennt: ja, er hat als nicht angesteckt erkannt, aber in dem Moment wo ich EVCC UI aufgerufen habe einen Stop-Befehl geschickt und schon ist DC-Ladevorgang abgebrochen :/

Das ist spannend. In Status A sollte das eigentlich nicht passieren weil es ja nix zu disablen gibt. Hast Du davon evtl. noch ein Logfile? Anders wäre es wenn schon Status C käme- dann denkte evcc natürlich, das Fahrzeug wäre lokal angeschlossen.

Evtl. habe ich es nicht gefunden, cool wäre wenn man Datenabfrage (z.B. 10 Sek) und Steuerintervalle (45 Sek) getrennt einstellen könnten.

Aktuell nicht geplant :O. Du kannst natürlich ein langsames Intervall von 1m einstellen.

@Adminius
Copy link
Contributor Author

Logfile habe ich nicht mehr. Das war schon vor ein paar Wochen und weil ich weit weg von Zuhause war, wäre es auch nicht leicht an die Logs zu kommen (außer Screenshots vom Smartphone). Ich versuche mal die Tage das wieder nachzustellen.

Aber was bringt mir noch längerer Intervall außer dass ich noch länger auf eine Aktualisierung warten muss was ich ja vermeiden will?
Steuerung mit 45s ist ausreichend. Ich will, dass die Anzeige sind schneller aktualisiert.

@andig
Copy link
Member

andig commented May 16, 2024

Ich will, dass die Anzeige sind schneller aktualisiert.

Das ist zum Glück ja "nur" optisch. Und: wenn Du in evcc eine Aktion wie Knopfdruck (Moduswechsel etc) triggerst passiert immer ein Update.

@Adminius
Copy link
Contributor Author

ja genau, das ist nur die Optik, die mich verwirrt :D

@bill340
Copy link

bill340 commented May 17, 2024

Zur Info...
Bei mir funktioniert das jetzt einwandfrei!
Ich teste mit 2 Teslas die in evcc über das normale evcc template eingebunden sind.
2 Ladepunkte zuhause mit TWC1 und jeweils dem teslalogger-charger.
Über den Geofence funktioniert das perfekt über evcc zuhause und unterwegs mischt sich evcc nicht ein, so wie es sein soll.
Ab und zu bekomme ich einen Fehler, dass der Charger out of sync ist. Aber das behebt sich meistens von selbst oder ich stoppe einmal das Laden und starte es neu.

@andig

This comment was marked as resolved.

@bill340

This comment was marked as resolved.

@Adminius
Copy link
Contributor Author

Hey @andig bin gerade unterwegs und am Supercharger geladen. EVCC container war tot und dann habe ich gestartet.
Obwohl Status A, werden Stromstärke und Stop Befehle gesendet:
Screenshot_20240518_092825_Home Assistant~2
Und im TeslaLogger:
Screenshot_20240518_093048_Chrome~2

Die Ladung am Supercharger wurde entsprechend gestoppt...

Jetzt ist EVCC an, mal schauen was EVCC am nächsten Supercharger macht.

@andig
Copy link
Member

andig commented May 18, 2024

Bräuchte mal ein Log, nicht nur einen unleserlichen Schnipsel

@andig
Copy link
Member

andig commented May 18, 2024

Achso: der Fehler ist der gleiche wie oben- du schickst halt enabled…

@Adminius
Copy link
Contributor Author

Ach, good point, ich habe jetzt ergänzt, dass Enebled=true auch nur "Zuhause" gesetzt wird.
Sorry, bin im Auto mitten auf der Autobahn, ich habe keine bessere Logs...

@Adminius
Copy link
Contributor Author

So, nun

enabled:
  source: http
  uri: http://192.168.x.x:5000/currentjson/3
  jq: if .charging and .TLGeofenceIsHome then true else false end

Das löst mein o.g. Problem, dass auch die DC-Charging gestoppt wird. Hacken dran.

"Enabled" macht bei meiner Idee keinen Sinn, dann egal was EVCC will, charging kann man nicht disablen, maximal stoppen.

Nun könnte man enabled=enable setzen. Das kann trotzdem zum OutOfSync führen, wenn EVCC disablen will, was gar nicht geht und Tesla wieder anfängt zu laden.
Nun, wie komme ich an die "enable" Variable?

enabled:
  source: script
  cmd: /bin/sh -c 'echo ${enable}'

Log:

[script] DEBUG 2024/05/28 09:40:40 /bin/sh -c echo ${enable}:
[lp-1 ] DEBUG 2024/05/28 09:40:40 pv charge current: 4.57A = 0A + 4.57A (-3152W @ 3p)
[lp-1 ] DEBUG 2024/05/28 09:40:40 site power -3152W <= 0W enable threshold
[lp-1 ] DEBUG 2024/05/28 09:40:40 pv enable in 0s
[lp-1 ] DEBUG 2024/05/28 09:40:40 pv enable timer elapsed
[lp-1 ] DEBUG 2024/05/28 09:40:40 max charge current: 3A
[lp-1 ] DEBUG 2024/05/28 09:40:43 charger enable

Zum OutOfSync führt es aber trotzdem (evtl. geht der Script einfach nicht?)

[lp-1 ] DEBUG 2024/05/28 09:44:25 charger status: C
[lp-1 ] INFO 2024/05/28 09:44:25 start charging ->
[lp-1 ] DEBUG 2024/05/28 09:44:25 wake-up timer: stop
[lp-1 ] DEBUG 2024/05/28 09:44:25 vehicle soc: 61%
[lp-1 ] DEBUG 2024/05/28 09:44:25 vehicle range: 316km
[script] DEBUG 2024/05/28 09:44:25 /bin/sh -c echo ${enable}:
[lp-1 ] WARN 2024/05/28 09:44:25 charger logic error: disabled but charging
[lp-1 ] DEBUG 2024/05/28 09:44:25 pv charge current: 5.92A = 3A + 2.92A (-2014W @ 3p)
[lp-1 ] DEBUG 2024/05/28 09:44:25 pv timer reset
[lp-1 ] DEBUG 2024/05/28 09:44:25 pv timer inactive
[lp-1 ] DEBUG 2024/05/28 09:44:25 max charge current: 5A


alternative theoretisch wäre auch:
source: http
uri: http://127.0.0.1:7070/api/state
jq: if .result.loadpoints[0].enabled then true else false end

Da weiß ich aber die ID nicht, wenn es mehrere Charger gibt.

Ich habe noch folgende Idee hier gefunden: #876

  enabled:
    type: script
    cmd: /bin/sh -c "cat /charger_enabled"
  enable:
    type: script
    cmd: /bin/sh -c "echo ${enable} > /charger_enabled"

damit wird zwar "enable" gespeichert, aber nicht der Tesla gesteuert...

@Adminius
Copy link
Contributor Author

Adminius commented Jun 3, 2024

@andig ideen wie ich unter "enabled:" an ${enable} dran komme? kann ich das überhaupt?

cmd: /bin/sh -c "echo true"

-> liefert true
[script] DEBUG 2024/06/03 09:12:55 /bin/sh -c echo true: true

cmd: /bin/sh -c "echo ${enable}"

-> liefert nichts:
[script] DEBUG 2024/06/03 09:19:37 /bin/sh -c echo ${enable}:

@andig
Copy link
Member

andig commented Jun 8, 2024

Ich verstehe die Frage nicht. Reden wir von enable(false) das keine Ausgabe produziert?

@Adminius
Copy link
Contributor Author

Adminius commented Jun 8, 2024

Ich verstehe die Frage nicht. Reden wir von enable(false) das keine Ausgabe produziert?

Variable ${enable} ist die Vorgabe von EVCC an die Wallbox, richtig?

Wie kann ich den Wert von ${enable} direkt unter "enabled:" (also Antwort von der Wallbox) Sektion als Antwort dem EVCC zur Verfügung stellen.
Ich will also, dass EVCC sich selbst anwortet ob Enabled oder nicht.

@andig
Copy link
Member

andig commented Jun 8, 2024

Entweder extern oder intern round-trippen. Extern hast Du oben stehen. Intern mit Go oder JS Plugin die sich eine "vm" teilen und die gleiche Variable verwenden. Sie demo.yaml für Beispiele.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
devices Specific device support enhancement New feature or request stale Outdated and ready to close
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants